﻿// =============================================
// 文件保护宏：防止该头文件被重复包含（避免编译错误）
// 如果尚未定义 CUSTOM_SURFACE_INCLUDED，则定义它并继续，否则跳过该文件内容的编译
// =============================================
#ifndef CUSTOM_SURFACE_INCLUDED
#define CUSTOM_SURFACE_INCLUDED

// =============================================
// 定义一个名为 Surface 的结构体（struct）
// 用于在 Shader 中统一封装和传递 “物体表面” 在光照计算时所需要的关键属性
// 这是一个非常常用的设计模式，有助于代码模块化、可读性、可维护性
// =============================================
struct Surface {
	// =========================================
	// 表面法线（单位向量），表示该点在 **世界空间或视图空间中的朝向**
	// 通常用于计算光照角度（如 N·L、N·H）、法线贴图、反射等
	// 类型：float3（x, y, z）
	// =========================================
	float3 normal;

	// =========================================
	// 视线方向（单位向量），表示从该表面点指向 **摄像机（观察者）的方向**
	// 通常用于计算菲涅尔效果、镜面反射方向、视角相关效果等
	// 类型：float3（x, y, z）
	// =========================================
	float3 viewDirection;

	// =========================================
	// 表面基础颜色（RGB），通常由贴图采样 × 基础颜色得到
	// 用于漫反射计算、与镜面反射混合等
	// 类型：float3（r, g, b），不包含透明度
	// =========================================
	float3 color;

	// =========================================
	// 表面透明度（Alpha），范围 [0, 1]，用于控制透明/半透明效果
	// 例如：玻璃、水、粒子等
	// 类型：float
	// =========================================
	float alpha;

	// =========================================
	// 金属度（Metallic），范围 [0, 1]
	// 0 表示非金属（如塑料、木头），反射较弱，颜色主要由漫反射决定
	// 1 表示金属（如铁、金），反射较强，颜色主要由表面颜色（即金属色）决定
	// 类型：float
	// =========================================
	float metallic;

	// =========================================
	// 光滑度（Smoothness），范围 [0, 1]
	// 控制镜面反射的高光区域的锐利程度：
	// - 0 表示非常粗糙（高光散射，如磨砂金属）
	// - 1 表示非常光滑（集中高光，如抛光金属、镜面）
	// 类型：float
	// =========================================
	float smoothness;
};

// =============================================
// 文件保护宏结束
// =============================================
#endif